home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / amyboard / amiga / amyboard.c next >
C/C++ Source or Header  |  1995-08-12  |  48KB  |  1,554 lines

  1. /***
  2. ***
  3. ***  amyboard.c -- Amiga front end for XBoard
  4. ***
  5. *** ------------------------------------------------------------------------
  6. *** This program is free software; you can redistribute it and/or modify
  7. *** it under the terms of the GNU General Public License as published by
  8. *** the Free Software Foundation; either version 2 of the License, or
  9. *** (at your option) any later version.
  10. ***
  11. *** This program is distributed in the hope that it will be useful,
  12. *** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. *** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. *** GNU General Public License for more details.
  15. ***
  16. *** You should have received a copy of the GNU General Public License
  17. *** along with this program; if not, write to the Free Software
  18. *** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  19. *** ------------------------------------------------------------------------
  20. ***
  21. **/
  22. /**/
  23.  
  24.  
  25. /***  Version information
  26. ***/
  27. #define VERSION         330
  28. #define REVISION        5
  29. #define DATE            "12.08.95"
  30. #define NAME            "AmyBoard"
  31. #define VERS            "AmyBoard 330.5"
  32. #define VSTRING         "AmyBoard 330.5 (12.08.95)"
  33. #define VERSTAG         "\0$VER: AmyBoard 330.5 (12.08.95)"
  34. /**/
  35.  
  36.  
  37. /***  Include files
  38. ***/
  39. #include "amyboard.h"
  40.  
  41. #include <libraries/gadtools.h>
  42. #include <libraries/asl.h>
  43. #include <libraries/iffparse.h>
  44. /**/
  45.  
  46.  
  47. /***  Global variables
  48. ***/
  49. char *programName                       = VERS;
  50.  
  51. AmigaAppData amigaAppData;
  52.  
  53. Object* xboardApp                           = NULL;
  54. Object* xboardWindow;
  55. Object* xboardChessboard;
  56. Object* xboardMenu;
  57. Object* xboardText;
  58. Object* xboardExtText;
  59. Object* xboardUpperTime;
  60. Object* xboardLowerTime;
  61. Object* editCommentWindow                   = NULL;
  62.  
  63.  
  64. void LoadGameProc(void);
  65. void LoadNextGameProc(void);
  66. void LoadPrevGameProc(void);
  67. void ReloadGameProc(void);
  68. void LoadPositionProc(void);
  69. void SaveGameProc(void);
  70. void SavePositionProc(void);
  71. void ReloadCmailMsgProc(void);
  72. void AboutProc(void);
  73. void QuitProc(void);
  74. void AlwaysQueenProc(void);
  75. void AutocommProc(void);
  76. void AutoflagProc(void);
  77. void AutoobsProc(void);
  78. void AutosaveProc(void);
  79. void AutoFlipViewProc(void);
  80. void BellProc(void);
  81. void FlipViewProc(void);
  82. void OldSaveStyleProc(void);
  83. void QuietPlayProc(void);
  84. void ShowCoordsProc(void);
  85. void ShowThinkingProc(void);
  86. void EditGameInfoProc(void);
  87. void EditCommentProc(void);
  88.  
  89. #define TOGGLE CHECKIT|MENUTOGGLE
  90. static struct NewMenu xboardNewMenu [] =
  91. { { NM_TITLE,   (STRPTR) "Project",              NULL,          0,        0,   NULL },
  92.   { NM_ITEM,    (STRPTR) "Reset Game",           (STRPTR) "r",  0,        0,   (APTR) ResetGameEvent },
  93.   { NM_ITEM,    (STRPTR) "Load Game",            (STRPTR) "g",  CHECKIT,  0,   (APTR) LoadGameProc },
  94.   { NM_ITEM,    (STRPTR) "Load Next Game",       (STRPTR) "N",  0,        0,   (APTR) LoadNextGameProc },
  95.   { NM_ITEM,    (STRPTR) "Load Previous Game",   (STRPTR) "P",  0,        0,   (APTR) LoadPrevGameProc },
  96.   { NM_ITEM,    (STRPTR) "Reload Same Game",     NULL,          0,        0,   (APTR) ReloadGameProc },
  97.   { NM_ITEM,    (STRPTR) "Load Position",        NULL,          0,        0,   (APTR) LoadPositionProc },
  98.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  99.   { NM_ITEM,    (STRPTR) "Save Game",            (STRPTR) "s",  0,        0,   (APTR) SaveGameProc },
  100.   { NM_ITEM,    (STRPTR) "Save Position",        NULL,          0,        0,   (APTR) SavePositionProc },
  101.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  102.   { NM_ITEM,    (STRPTR) "Mail Move",            NULL,          0,        0,   (APTR) MailMoveEvent },
  103.   { NM_ITEM,    (STRPTR) "Reload CMail Message", NULL,          0,        0,   (APTR) ReloadCmailMsgProc },
  104.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  105.   { NM_ITEM,    (STRPTR) "About",                NULL,          0,        0,   (APTR) AboutProc },
  106.   { NM_ITEM,    (STRPTR) "Exit",                 (STRPTR) "q",  0,        0,   (APTR) QuitProc },
  107.   { NM_TITLE,   (STRPTR) "Mode",                 NULL,          0,        0,   NULL },
  108.   { NM_ITEM,    (STRPTR) "Machine White",        NULL,          CHECKIT,  496, (APTR) MachineWhiteEvent },
  109.   { NM_ITEM,    (STRPTR) "Machine Black",        NULL,          CHECKIT,  488, (APTR) MachineBlackEvent },
  110.   { NM_ITEM,    (STRPTR) "Two Machines",         NULL,          CHECKIT,  472, (APTR) TwoMachinesEvent },
  111.   { NM_ITEM,    (STRPTR) "ICS Client",           NULL,          CHECKIT,  440, (APTR) IcsClientEvent },
  112.   { NM_ITEM,    (STRPTR) "Edit Game",            NULL,          CHECKIT,  376, (APTR) EditGameEvent },
  113.   { NM_ITEM,    (STRPTR) "Edit Position",        NULL,          CHECKIT,  248, (APTR) EditPositionEvent },
  114.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  115.   { NM_ITEM,    (STRPTR) "Show Game List",       NULL,          0,        0,   (APTR) ShowGameListProc },
  116.   { NM_ITEM,    (STRPTR) "Edit Tags",            NULL,          0,        0,   (APTR) EditTagsProc },
  117.   { NM_ITEM,    (STRPTR) "Edit Comment",         NULL,          0,        0,   (APTR) EditCommentProc },
  118.   { NM_ITEM,    (STRPTR) "Pause",                (STRPTR) "p",  CHECKIT,  0,   (APTR) PauseEvent },
  119.   { NM_TITLE,   (STRPTR) "Action",               NULL,          0,        0,   NULL },
  120.   { NM_ITEM,    (STRPTR) "Accept",               NULL,          0,        0,   (APTR) AcceptEvent },
  121.   { NM_ITEM,    (STRPTR) "Decline",              NULL,          0,        0,   (APTR) DeclineEvent },
  122.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  123.   { NM_ITEM,    (STRPTR) "Call Flag",            (STRPTR) "t",  0,        0,   (APTR) CallFlagEvent },
  124.   { NM_ITEM,    (STRPTR) "Draw",                 (STRPTR) "d",  0,        0,   (APTR) DrawEvent },
  125.   { NM_ITEM,    (STRPTR) "Adjourn",              NULL,          0,        0,   (APTR) AdjournEvent },
  126.   { NM_ITEM,    (STRPTR) "Abort",                NULL,          0,        0,   (APTR) AbortEvent },
  127.   { NM_ITEM,    (STRPTR) "Resign",               (STRPTR) "R",  0,        0,   (APTR) ResignEvent },
  128.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  129.   { NM_ITEM,    (STRPTR) "Stop Observing",       NULL,          0,        0,   (APTR) StopObservingEvent },
  130.   { NM_ITEM,    (STRPTR) "Stop Examining",       NULL,          0,        0,   (APTR) StopExaminingEvent },
  131.   { NM_TITLE,   (STRPTR) "Step",                 NULL,          0,        0,   NULL },
  132.   { NM_ITEM,    (STRPTR) "Backward",             (STRPTR) "b",  0,        0,   (APTR) BackwardEvent },
  133.   { NM_ITEM,    (STRPTR) "Forward",              (STRPTR) "f",  0,        0,   (APTR) ForwardEvent },
  134.   { NM_ITEM,    (STRPTR) "Back to Start",        (STRPTR) "B",  0,        0,   (APTR) ToStartEvent },
  135.   { NM_ITEM,    (STRPTR) "Forward to End",       (STRPTR) "F",  0,        0,   (APTR) ToEndEvent },
  136.   { NM_ITEM,    (STRPTR) "Revert",               NULL,          0,        0,   (APTR) RevertEvent },
  137.   { NM_ITEM,    (STRPTR) "Truncate Game",        NULL,          0,        0,   (APTR) TruncateGameEvent },
  138.   { NM_ITEM,    NM_BARLABEL,                     NULL,          0,        0,   NULL },
  139.   { NM_ITEM,    (STRPTR) "Move Now",             NULL,          0,        0,   (APTR) MoveNowEvent },
  140.   { NM_ITEM,    (STRPTR) "Retract Move",         NULL,          0,        0,   (APTR) RetractMoveEvent },
  141.   { NM_TITLE,   (STRPTR) "Options",              NULL,          0,        0,   NULL },
  142.   { NM_ITEM,    (STRPTR) "Always Queen",         NULL,          TOGGLE,   0,   (APTR) AlwaysQueenProc },
  143.   { NM_ITEM,    (STRPTR) "Auto Comment",         NULL,          TOGGLE,   0,   (APTR) AutocommProc },
  144.   { NM_ITEM,    (STRPTR) "Auto Flag",            NULL,          TOGGLE,   0,   (APTR) AutoflagProc },
  145.   { NM_ITEM,    (STRPTR) "Auto Observe",         NULL,          TOGGLE,   0,   (APTR) AutoobsProc },
  146.   { NM_ITEM,    (STRPTR) "Auto Save",            NULL,          TOGGLE,   0,   (APTR) AutosaveProc },
  147.   { NM_ITEM,    (STRPTR) "Auto Flip View",       NULL,          TOGGLE,   0,   (APTR) AutoFlipViewProc },
  148.   { NM_ITEM,    (STRPTR) "Bell",                 NULL,          TOGGLE,   0,   (APTR) BellProc },
  149.   { NM_ITEM,    (STRPTR) "Flip View",            NULL,          TOGGLE,   0,   (APTR) FlipViewProc },
  150.   { NM_ITEM,    (STRPTR) "Old Save Style",       NULL,          TOGGLE,   0,   (APTR) OldSaveStyleProc },
  151.   { NM_ITEM,    (STRPTR) "Quiet Play",           NULL,          TOGGLE,   0,   (APTR) QuietPlayProc },
  152.   { NM_ITEM,    (STRPTR) "Show Coords",          NULL,          TOGGLE,   0,   (APTR) ShowCoordsProc },
  153.   { NM_ITEM,    (STRPTR) "Show Thinking",        NULL,          TOGGLE,   0,   (APTR) ShowThinkingProc },
  154.   { NM_TITLE,   (STRPTR) "Help",                 NULL,          0,        0,   NULL },
  155.   { NM_ITEM,    (STRPTR) "Hint",                 NULL,          0,        0,   (APTR) HintEvent },
  156.   { NM_ITEM,    (STRPTR) "Book",                 NULL,          0,        0,   (APTR) BookEvent },
  157.   { NM_ITEM,    (STRPTR) "About Game",           NULL,          0,        0,   (APTR) AboutGameEvent },
  158.   { NM_END,     NULL,                            NULL,          0,        0,   NULL }
  159. };
  160. /**/
  161.  
  162.  
  163. /***  Cleanup function
  164. ***/
  165. void Cleanup(void)
  166.  
  167. { if(xboardApp)
  168.   { MUI_DisposeObject(xboardApp);
  169.   }
  170.   TimeClose();
  171.   PipesClose();
  172.   MuiClassClose();
  173. }
  174. /**/
  175.  
  176.  
  177. /***  Argument section
  178. ***
  179. ***  The following macro consists of a repeated use of the macro
  180. ***  XBOARD_ARG, one for each possible argument. The macro's synopsis
  181. ***  is
  182. ***
  183. ***    XBOARD_ARG(argName, type, template, defaultVal, helpString);
  184. ***
  185. ***  Inputs:
  186. ***     argName - the arguments name; an entry of the struct AppData
  187. ***         (see common.h)
  188. ***     type - the argument type as defined by ParseArgs()
  189. ***     template - a template string that may be used by ReadArgs()
  190. ***     defaultVal - default value
  191. ***     helpString - string to be printed if the user requests help;
  192. ***         may be empty in case the argument should not be displayed
  193. ***         to the user. (Some arguments are present for source code
  194. ***         compatibility only.)
  195. ***
  196. ***  This file is used from xboard.c by including it repeatedly with
  197. ***  different definitions of XBOARD_ARG. For example, to get the
  198. ***  defaults we do the following:
  199. ***
  200. ***   #define XBOARD_ARG(argName, type, template, defaultVal, helpString) \
  201. ***     appData.argName = defaultVal;
  202. ***   XBOARD_ARGS
  203. ***
  204. ***************************************************************************/
  205. #define XBOARD_ARGS \
  206. XBOARD_ARG(appData.whitePieceColor,      PARSEARGS_TYPE_INTEGER, "WPP=WHITEPIECEPEN",       -1,                   "\twpp=whitePiecePen/K/N pennumber\n")\
  207. XBOARD_ARG(appData.blackPieceColor,      PARSEARGS_TYPE_INTEGER, "BPP=BLACKPIECEPEN",       -1,                   "\tbpp=blackPiecePen/K/N pennumber\n")\
  208. XBOARD_ARG(appData.lightSquareColor,     PARSEARGS_TYPE_INTEGER, "LSP=LIGHTSQUAREPEN",      -1,                   "\tlsp=lightSquarePen/K/N pennumber\n")\
  209. XBOARD_ARG(appData.darkSquareColor,      PARSEARGS_TYPE_INTEGER, "DSP=DARKSQUAREPEN",       -1,                   "\tdsp=darkSquarePen/K/N pennumber\n")\
  210. XBOARD_ARG(appData.movesPerSession,      PARSEARGS_TYPE_INTEGER, "MP=MOVESPERSESSION",      MOVES_PER_SESSION,    "\tmp=movesPerSession/K/N number\n")\
  211. XBOARD_ARG(appData.initString,           PARSEARGS_TYPE_STRING,  "INITSTRING",              INIT_STRING,          "")\
  212. XBOARD_ARG(appData.whiteString,          PARSEARGS_TYPE_STRING,  "WHITESTRING",             WHITE_STRING,         "")\
  213. XBOARD_ARG(appData.blackString,          PARSEARGS_TYPE_STRING,  "BLACKSTRING",             BLACK_STRING,         "")\
  214. XBOARD_ARG(appData.firstChessProgram,    PARSEARGS_TYPE_STRING,  "FCP=FIRSTCHESSPROGRAM",   "gnuchessx",          "")\
  215. XBOARD_ARG(appData.secondChessProgram,   PARSEARGS_TYPE_STRING,  "SCP=SECONDCHESSPROGRAM",  "gnuchessx",          "")\
  216. XBOARD_ARG(appData.noChessProgram,       PARSEARGS_TYPE_BOOL,    "NCP=NOCHESSPROGRAM",      FALSE,                "\tncp=noChessProgram/T\n")\
  217. XBOARD_ARG(appData.firstHost,            PARSEARGS_TYPE_STRING,  "FIRSTHOST",               FIRST_HOST,           "")\
  218. XBOARD_ARG(appData.secondHost,           PARSEARGS_TYPE_STRING,  "SECONDHOST",              SECOND_HOST,          "")\
  219. XBOARD_ARG(appData.bitmapDirectory,      PARSEARGS_TYPE_STRING,  "BITMAPDIRECTORY",         NULL,                 "\tbmdir=bitmapDirectory/K dirname\n")\
  220. XBOARD_ARG(appData.remoteShell,          PARSEARGS_TYPE_STRING,  "REMOTESHELL",             "",                   "")\
  221. XBOARD_ARG(appData.remoteUser,           PARSEARGS_TYPE_STRING,  "REMOTEUSER",              "",                   "")\
  222. XBOARD_ARG(appData.timeDelay,            PARSEARGS_TYPE_FLOAT,   "TIMEDELAY",               TIME_DELAY,           "")\
  223. XBOARD_ARG(appData.timeControl,          PARSEARGS_TYPE_STRING,  "TIMECONTROL",             TIME_CONTROL,         "\ttc=timeControl/K\n")\
  224. XBOARD_ARG(appData.icsActive,            PARSEARGS_TYPE_BOOL,    "ICS=ICSACTIVE",           FALSE,                "\tics=icsActive/T\n")\
  225. XBOARD_ARG(appData.icsHost,              PARSEARGS_TYPE_STRING,  "ICSHOST",                 ICS_HOST,             "\ticsHost/K hostname\n")\
  226. XBOARD_ARG(appData.icsPort,              PARSEARGS_TYPE_STRING,  "ICSPORT",                 ICS_PORT,             "\ticsPort/K portnumber\n")\
  227. XBOARD_ARG(appData.icsCommPort,          PARSEARGS_TYPE_STRING,  "ICSCOMMPORT",             ICS_COMM_PORT,        "")\
  228. XBOARD_ARG(appData.icsLogon,             PARSEARGS_TYPE_STRING,  "ICSLOGON",                ".icsrc",             "\ticsLogon/K scriptname\n")\
  229. XBOARD_ARG(appData.useTelnet,            PARSEARGS_TYPE_BOOL,    "USETELNET",               TRUE,                 "")\
  230. XBOARD_ARG(appData.telnetProgram,        PARSEARGS_TYPE_STRING,  "TELNETPROGRAM",           "AmiTCP:bin/telnet",  "\ttp=telnetProgram/K programpath\n")\
  231. XBOARD_ARG(appData.gateway,              PARSEARGS_TYPE_STRING,  "GATEWAY",                 "",                   "")\
  232. XBOARD_ARG(appData.loadGameFile,         PARSEARGS_TYPE_STRING,  "LGF=LOADGAMEFILE",        "",                   "\tlgf=loadGameFile/K filename\n")\
  233. XBOARD_ARG(appData.loadGameIndex,        PARSEARGS_TYPE_INTEGER, "LGI=LOADGAMEINDEX",       0,                    "\tlgi=loadGameIndex/K/N gamenumber\n")\
  234. XBOARD_ARG(appData.saveGameFile,         PARSEARGS_TYPE_STRING,  "SGF=SAVEGAMEFILE",        "",                   "\tsgf=saveGameFile/K filename\n")\
  235. XBOARD_ARG(appData.autoSaveGames,        PARSEARGS_TYPE_BOOL,    "AUTOSAVEGAMES",           FALSE,                "\tautoSaveGames/T\n")\
  236. XBOARD_ARG(appData.loadPositionFile,     PARSEARGS_TYPE_STRING,  "LPF=LOADPOSITIONFILE",    "",                   "\tlpf=loadPositionFile/K filename\n")\
  237. XBOARD_ARG(appData.loadPositionIndex,    PARSEARGS_TYPE_INTEGER, "LPI=LOADPOSITIONINDEX",   1,                    "\tlpi=loadPositionIndex/K/N positionnumber\n")\
  238. XBOARD_ARG(appData.savePositionFile,     PARSEARGS_TYPE_STRING,  "SPF=SAVEPOSITIONFILE",    "",                   "\tspf=savePositionFile/K filename\n")\
  239. XBOARD_ARG(appData.matchMode,            PARSEARGS_TYPE_BOOL,    "MM=MATCHMODE",            FALSE,                "\tmm=matchMode/T\n")\
  240. XBOARD_ARG(appData.monoMode,             PARSEARGS_TYPE_BOOL,    "MONO=MONOMODE",           FALSE,                "")\
  241. XBOARD_ARG(appData.debugMode,            PARSEARGS_TYPE_BOOL,    "DEBUG=DEBUGMODE",         FALSE,                "")\
  242. XBOARD_ARG(appData.clockMode,            PARSEARGS_TYPE_BOOL,    "CM=CLOCKMODE",            TRUE,                 "\tcm=clockMode/T\n")\
  243. XBOARD_ARG(appData.boardSize,            PARSEARGS_TYPE_STRING,  "SIZE=BOARDSIZE",          "",                   "\tsize=boardSize/K [small|medium|big]\n")\
  244. XBOARD_ARG(appData.Iconic,               PARSEARGS_TYPE_BOOL,    "ICONIC",                  FALSE,                "")\
  245. XBOARD_ARG(appData.searchTime,           PARSEARGS_TYPE_STRING,  "ST=SEARCHTIME",           "",                   "\tst=searchTime/K minutes:seconds\n")\
  246. XBOARD_ARG(appData.searchDepth,          PARSEARGS_TYPE_INTEGER, "SD=SEARCHDEPTH",          0,                    "\tsd=searchDepth/K/N number\n")\
  247. XBOARD_ARG(appData.showCoords,           PARSEARGS_TYPE_BOOL,    "COORDS=SHOWCOORDS",       FALSE,                "")\
  248. XBOARD_ARG(appData.clockFont,            PARSEARGS_TYPE_STRING,  "CLOCKFONT",               "",                   "")\
  249. XBOARD_ARG(appData.messageFont,          PARSEARGS_TYPE_STRING,  "MESSAGEFONT",             "",                   "")\
  250. XBOARD_ARG(appData.coordFont,            PARSEARGS_TYPE_STRING,  "COORDFONT",               "",                   "")\
  251. XBOARD_ARG(appData.ringBellAfterMoves,   PARSEARGS_TYPE_BOOL,    "BELL=RINGBELLAFTERMOVES", FALSE,                "\tbell=ringBellAfterMoves/T\n")\
  252. XBOARD_ARG(appData.autoCallFlag,         PARSEARGS_TYPE_BOOL,    "CALLFLAG",                FALSE,                "\tcallFlag/T\n")\
  253. XBOARD_ARG(appData.flipView,             PARSEARGS_TYPE_BOOL,    "FLIPVIEW",                FALSE,                "\tflipView/T\n")\
  254. XBOARD_ARG(appData.cmailGameName,        PARSEARGS_TYPE_STRING,  "CMAILGAMENAME",           "",                   "")\
  255. XBOARD_ARG(appData.alwaysPromoteToQueen, PARSEARGS_TYPE_BOOL,    "ALWAYSQUEEN",             FALSE,                "\talwaysQueen/T\n")\
  256. XBOARD_ARG(appData.oldSaveStyle,         PARSEARGS_TYPE_BOOL,    "OLDSAVESTYLE",            FALSE,                "")\
  257. XBOARD_ARG(appData.quietPlay,            PARSEARGS_TYPE_BOOL,    "QUIETPLAY",               FALSE,                "")\
  258. XBOARD_ARG(appData.showThinking,         PARSEARGS_TYPE_BOOL,    "SHOWTHINKING",            FALSE,                "\tshowThinking/T\n")\
  259. XBOARD_ARG(appData.autoObserve,          PARSEARGS_TYPE_BOOL,    "AUTOOBSERVE",             FALSE,                "\tobserve/T\n")\
  260. XBOARD_ARG(appData.autoComment,          PARSEARGS_TYPE_BOOL,    "AUTOCOMMENT",             FALSE,                "")\
  261. XBOARD_ARG(appData.borderXoffset,        PARSEARGS_TYPE_INTEGER, "BORDERXOFFSET",           FALSE,                "")\
  262. XBOARD_ARG(appData.borderYoffset,        PARSEARGS_TYPE_INTEGER, "BORDERYOFFSET",           FALSE,                "")\
  263. XBOARD_ARG(appData.titleInWindow,        PARSEARGS_TYPE_BOOL,    "TITLEINWINDOW",           TRUE,                 "")\
  264. XBOARD_ARG(appData.localEdit,            PARSEARGS_TYPE_BOOL,    "LOCALEDIT",               FALSE,                "")\
  265. XBOARD_ARG(appData.autoFlipView,         PARSEARGS_TYPE_BOOL,    "AUTOFLIPVIEW",            TRUE,                 "")\
  266. XBOARD_ARG(appData.zippyTalk,            PARSEARGS_TYPE_BOOL,    "ZIPPYTALK",               FALSE,                "")\
  267. XBOARD_ARG(appData.zippyPlay,            PARSEARGS_TYPE_BOOL,    "ZIPPYPLAY",               FALSE,                "")\
  268. XBOARD_ARG(amigaAppData.icsWindow,       PARSEARGS_TYPE_STRING,  "ICSWINDOW",               NULL,                 "")\
  269. XBOARD_ARG(amigaAppData.childPriority,   PARSEARGS_TYPE_INTEGER, "CHILDPRIORITY",           0,                    "\tchildPriority/K/N number\n")\
  270. XBOARD_ARG(amigaAppData.childStack,      PARSEARGS_TYPE_INTEGER, "CHILDSTACK",              100000,               "\tchildStack/K/N number\n")
  271.  
  272.  
  273.  
  274.  
  275. int ProcessArgs(int argc, char *argv[])
  276.  
  277. { static const Tag parseArgTags[] =
  278.   {
  279. #undef XBOARD_ARG
  280. #define XBOARD_ARG(argName, type, template, defaultVal, helpString) \
  281.     PARSEARGS_ARGNAME,    (Tag) template,        \
  282.     PARSEARGS_TYPE,       type,                  \
  283.     PARSEARGS_VALPTR,     (Tag) &argName,
  284.     XBOARD_ARGS
  285.  
  286. #undef XBOARD_ARG
  287. #define XBOARD_ARG(argName, type, template, defaultVal, helpString) \
  288.     helpString
  289.     PARSEARGS_HELPSTRING, (Tag) XBOARD_ARGS,
  290.  
  291.     PARSEARGS_PREFSFILE,  (Tag) "PROGDIR:lib/amyboard.prefs",
  292.     PARSEARGS_PREFSFILE,  (Tag) "PROGDIR:/lib/amyboard.prefs",
  293.     PARSEARGS_PREFSFILE,  (Tag) "ENV:amyboard.prefs",
  294.     TAG_DONE
  295.   };
  296.  
  297. #undef XBOARD_ARG
  298. #define XBOARD_ARG(argName, type, template, defaultVal, helpString) \
  299.     argName = defaultVal;
  300.   XBOARD_ARGS
  301.  
  302.   return(ParseArgsA(argc, argv, (struct TagItem *) parseArgTags));
  303. }
  304. /**/
  305.  
  306.  
  307. /***  ICSInitScript function
  308. ***/
  309. void ICSInitScript(void)
  310.  
  311. { FILE *fp = NULL;
  312.   char buf[MSG_SIZ];
  313.   char **ptr, *fileName;
  314.   static char *searchDirs[] =
  315.   { "",
  316.     "PROGDIR:",
  317.     "PROGDIR:lib",
  318.     "PROGDIR:/lib",
  319.     "ENV:",
  320.     NULL
  321.   };
  322.  
  323.   for (ptr = searchDirs;  *ptr;  ptr++)
  324.   { if (**ptr)
  325.     { strcpy(buf, *ptr);
  326.       AddPart((STRPTR) buf, (STRPTR) appData.icsLogon, sizeof(buf));
  327.       fileName = buf;
  328.     }
  329.     else
  330.     { fileName = appData.icsLogon;
  331.     }
  332.     if ((fp = fopen(fileName, "r")))
  333.     { break;
  334.     }
  335.   }
  336.  
  337.   if (fp)
  338.   { ProcessICSInitScript(fp);
  339.   }
  340. }
  341. /**/
  342.  
  343.  
  344. /***  main() function
  345. ***
  346. ***  Initializing and main loop.
  347. **/
  348. void CreateMUIApp(void);
  349. int main(int argc, char *argv[])
  350.  
  351. { ULONG signalmask;
  352.  
  353.   /**
  354.   ***  Get stderr, if running from Workbench.
  355.   **/
  356.   if (!argc)
  357.   { if (!freopen("CON:////amyboard stderr/AUTO", "w", stderr))
  358.     { exit(10);
  359.     }
  360.   }
  361.   debugFP = stderr;
  362.   toUserFP = stderr;
  363.  
  364.   if (atexit(Cleanup))
  365.   { exit(10);
  366.   }
  367.  
  368.   MuiClassInit();
  369.   PipesInit();
  370.   TimeInit();
  371.  
  372.  
  373.   if (!(ProcessArgs(argc, argv)))
  374.   { fprintf(stderr, "Error %ld while parsing arguments.\n", IoErr());
  375.     exit(10);
  376.   }
  377.  
  378.   InitBackEnd1();
  379.  
  380.   CreateMUIApp();
  381.  
  382.   InitBackEnd2();
  383.  
  384.   if (appData.icsActive)
  385.   { ICSInitScript();
  386.   }
  387.  
  388.   signalmask = timeSignals |
  389.            SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_C;
  390.  
  391.   for(;;)
  392.   { ULONG receivedsigs;
  393.     ULONG muisigs;
  394.     LONG id;
  395.  
  396.     while ((id = DoMethod(xboardApp, MUIM_Application_Input, &muisigs)))
  397.     { switch (id)
  398.       { case MUIV_Application_ReturnID_Quit:
  399.       ExitEvent(0);
  400.       break;
  401.       }
  402.     }
  403.  
  404.     receivedsigs = Wait(muisigs | pipeSignals | signalmask);
  405.  
  406.     if (receivedsigs & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D))
  407.     { ExitEvent(0);
  408.     }
  409.     if (receivedsigs & timeSignals)
  410.     { TimeCallback(receivedsigs);
  411.     }
  412.     if (receivedsigs & pipeSignals)
  413.     { DoInputCallback(receivedsigs);
  414.     }
  415.   }
  416. }
  417. #if defined(_DCC)
  418. int wbmain(struct WBStartup *wbs){return(main(0, (char **)wbs));}
  419. #endif
  420. /**/
  421.  
  422.  
  423. /***  ResetFrontEnd() function
  424. ***
  425. ***  Called from backend.
  426. **/
  427. void CommentPopDown(void);
  428. void EditCommentPopDown(void);
  429. APTR ProcToMenuitem(APTR);
  430. void ResetFrontEnd()
  431.  
  432. { CommentPopDown();
  433.   EditCommentPopDown();
  434.   TagsPopDown();
  435.   DrawPosition(TRUE, NULL);
  436. }
  437. /**/
  438.  
  439.  
  440. /***  Menuitem section
  441. ***
  442. ***  The following structures define, which menuitems are enabled
  443. ***  or disabled in different program modes.
  444. **/
  445. typedef struct
  446. { APTR Proc;
  447.   Boolean value;
  448. } Sensitivity;
  449.  
  450.  
  451. APTR ProcToMenuitem(APTR proc)
  452.  
  453. { if (!proc)
  454.   { return(NULL);
  455.   }
  456.   return((APTR) DoMethod(xboardMenu, MUIM_FindUData, proc));
  457. }
  458.  
  459. void SetMenuSensitivity(Sensitivity *sens)
  460.  
  461. { APTR obj;
  462.  
  463.   while(sens->Proc != NULL)
  464.   { if ((obj = ProcToMenuitem(sens->Proc)))
  465.     { set(obj, MUIA_Menuitem_Enabled, sens->value);
  466.     }
  467.     ++sens;
  468.   }
  469. }
  470.  
  471. Sensitivity icsSensitivity[] =
  472. { { (APTR) MailMoveEvent,          FALSE },
  473.   { (APTR) ReloadCmailMsgProc,     FALSE },
  474.   { (APTR) MachineBlackEvent,      FALSE },
  475.   { (APTR) MachineWhiteEvent,      FALSE },
  476.   { (APTR) TwoMachinesEvent,       FALSE },
  477. #ifndef ZIPPY
  478.   { (APTR) HintEvent,              FALSE },
  479.   { (APTR) BookEvent,              FALSE },
  480.   { (APTR) MoveNowEvent,           FALSE },
  481.   { (APTR) ShowThinkingProc,       FALSE },
  482. #endif
  483.   { NULL,                   FALSE }
  484. };
  485. void SetICSMode(void)
  486.  
  487. { SetMenuSensitivity(icsSensitivity);
  488. }
  489.  
  490.  
  491. Sensitivity ncpSensitivity[] =
  492. { { (APTR) MailMoveEvent,          FALSE },
  493.   { (APTR) ReloadCmailMsgProc,     FALSE },
  494.   { (APTR) MachineBlackEvent,      FALSE },
  495.   { (APTR) MachineWhiteEvent,      FALSE },
  496.   { (APTR) TwoMachinesEvent,       FALSE },
  497.   { (APTR) IcsClientEvent,         FALSE },
  498.  
  499.   /**
  500.   ***  The original xboard has an
  501.  
  502.   { (APTR) ActionProc,             FALSE },
  503.  
  504.   ***  here. As this would require to separate between menuitems
  505.   ***  ans menustrips in SetMenuSensitivity(), we better disable
  506.   ***  any menuitem instead of the menustrip below.
  507.   **/
  508.   { (APTR) AcceptEvent,            FALSE },
  509.   { (APTR) DeclineEvent,           FALSE },
  510.   { (APTR) CallFlagEvent,          FALSE },
  511.   { (APTR) DrawEvent,              FALSE },
  512.   { (APTR) AdjournEvent,           FALSE },
  513.   { (APTR) AbortEvent,             FALSE },
  514.   { (APTR) ResignEvent,            FALSE },
  515.   { (APTR) StopObservingEvent,     FALSE },
  516.   { (APTR) StopExaminingEvent,     FALSE },
  517.  
  518.  
  519.   { (APTR) RevertEvent,            FALSE },
  520.   { (APTR) MoveNowEvent,           FALSE },
  521.   { (APTR) RetractMoveEvent,       FALSE },
  522.   { (APTR) AutoflagProc,           FALSE },
  523.   { (APTR) AutoobsProc,            FALSE },
  524.   { (APTR) BellProc,               FALSE },
  525.   { (APTR) QuietPlayProc,          FALSE },
  526.   { (APTR) ShowThinkingProc,       FALSE },
  527.   { (APTR) HintEvent,              FALSE },
  528.   { (APTR) BookEvent,              FALSE },
  529.   { NULL,                   FALSE }
  530. };
  531. void SetNCPMode(void)
  532.  
  533. { SetMenuSensitivity(ncpSensitivity);
  534. }
  535.  
  536.  
  537. Sensitivity gnuSensitivity[] =
  538. { { (APTR) IcsClientEvent,         FALSE },
  539.   { (APTR) AcceptEvent,            FALSE },
  540.   { (APTR) DeclineEvent,           FALSE },
  541.   { (APTR) DrawEvent,              FALSE },
  542.   { (APTR) AdjournEvent,           FALSE },
  543.   { (APTR) StopExaminingEvent,     FALSE },
  544.   { (APTR) StopObservingEvent,     FALSE },
  545.   { (APTR) RevertEvent,            FALSE },
  546.   { (APTR) AutoflagProc,           FALSE },
  547.   { (APTR) AutoobsProc,            FALSE },
  548.   { (APTR) QuietPlayProc,          FALSE },
  549.   { (APTR) MailMoveEvent,          FALSE },
  550.   { (APTR) ReloadCmailMsgProc,     FALSE },
  551.   { NULL,                   FALSE }
  552. };
  553. void SetGNUMode(void)
  554.  
  555. { SetMenuSensitivity(gnuSensitivity);
  556. }
  557.  
  558.  
  559. Sensitivity cmailSensitivity[] =
  560. { /**
  561.   ***  The original xboard has an
  562.  
  563.   { (APTR) ActionProc,             TRUE },
  564.  
  565.   ***  here. As this would require to separate between menuitems
  566.   ***  ans menustrips in SetMenuSensitivity(), we better disable
  567.   ***  any menuitem instead of the menustrip below.
  568.   **/
  569.   { (APTR) AcceptEvent,            TRUE },
  570.   { (APTR) DeclineEvent,           TRUE },
  571.   { (APTR) CallFlagEvent,          FALSE },
  572.   { (APTR) DrawEvent,              FALSE },
  573.   { (APTR) AdjournEvent,           FALSE },
  574.   { (APTR) AbortEvent,             FALSE },
  575.   { (APTR) ResignEvent,            TRUE },
  576.   { (APTR) StopObservingEvent,     FALSE },
  577.   { (APTR) StopExaminingEvent,     FALSE },
  578.  
  579.   { (APTR) MailMoveEvent,          FALSE },
  580.   { (APTR) ReloadCmailMsgProc,     FALSE },
  581.   { NULL,                   FALSE }
  582. };
  583. void SetCmailMode(void)
  584.  
  585. { SetMenuSensitivity(cmailSensitivity);
  586. }
  587. /**/
  588.  
  589.  
  590. /***  DrawPosition() function
  591. ***
  592. ***  takes advantage of the MUI chessboard gadget.
  593. **/
  594. void DrawPosition(int fullRedraw, Board board)
  595.  
  596. { static int oldFlipView = -1;
  597.  
  598.   if (flipView != oldFlipView)
  599.   { set(xboardChessboard, MUIA_XBoard_FlipView, flipView);
  600.     oldFlipView = flipView;
  601.     fullRedraw = TRUE;
  602.     set(ProcToMenuitem((APTR) FlipViewProc), MUIA_Menuitem_Checked, flipView);
  603.   }
  604.  
  605.   DoMethod(xboardChessboard, MUIM_XBoard_DrawPosition, fullRedraw, board);
  606. }
  607. /**/
  608.  
  609.  
  610. /***  ModeToObject() function
  611. ***
  612. ***  Converts gamemodes into functions that initialize them
  613. **/
  614. APTR *ModeToObject(GameMode mode)
  615.  
  616. { APTR proc;
  617.  
  618.   switch(mode)
  619.   { case BeginningOfGame:
  620.       if (appData.icsActive)
  621.       { proc = (APTR) IcsClientEvent;
  622.       }
  623.       else if (appData.noChessProgram  ||
  624.            *appData.cmailGameName != NULLCHAR)
  625.       { proc = (APTR) EditGameEvent;
  626.       }
  627.       else
  628.       { proc = (APTR) MachineBlackEvent;
  629.       }
  630.       break;
  631.     case MachinePlaysBlack:
  632.       proc = (APTR) MachineBlackEvent;
  633.       break;
  634.     case MachinePlaysWhite:
  635.       proc = (APTR) MachineWhiteEvent;
  636.       break;
  637.     case TwoMachinesPlay:
  638.       proc = (APTR) TwoMachinesEvent;
  639.       break;
  640.     case EditGame:
  641.       proc = (APTR) EditGameEvent;
  642.       break;
  643.     case PlayFromGameFile:
  644.       proc = (APTR) LoadGameProc;
  645.       break;
  646.     case EditPosition:
  647.       proc = (APTR) EditPositionEvent;
  648.       break;
  649.     case IcsPlayingWhite:
  650.     case IcsPlayingBlack:
  651.     case IcsObserving:
  652.     case IcsIdle:
  653.     case IcsExamining:
  654.       proc = (APTR) IcsClientEvent;
  655.       break;
  656.     default:
  657.       return(NULL);
  658.   }
  659.  
  660.   return(ProcToMenuitem(proc));
  661. }
  662. /**/
  663.  
  664.  
  665. /***  ModeHighlight() function
  666. ***
  667. **/
  668. void ModeHighlight(void)
  669.  
  670. { static int oldPausing = FALSE;
  671.   static int oldEditPositionMode = -1;
  672.   int editPositionMode;
  673.   static GameMode oldmode = (GameMode) -1;
  674.   APTR menuitemObject;
  675.  
  676.   if (pausing != oldPausing)
  677.   { menuitemObject = ProcToMenuitem((APTR) PauseEvent);
  678.     oldPausing = pausing;
  679.     if (menuitemObject)
  680.     { if (pausing)
  681.       { set(menuitemObject, MUIA_Menuitem_Checked, TRUE);
  682.       }
  683.       else
  684.       { set(menuitemObject, MUIA_Menuitem_Checkit, FALSE);
  685.       }
  686.     }
  687.   }
  688.  
  689.   if (oldmode != gameMode  &&  (menuitemObject = ModeToObject(oldmode)))
  690.   { set(menuitemObject, MUIA_Menuitem_Checked, FALSE);
  691.   }
  692.   if ((menuitemObject = ModeToObject(gameMode)))
  693.   { set(menuitemObject, MUIA_Menuitem_Checked, TRUE);
  694.   }
  695.   oldmode = gameMode;
  696.  
  697.   editPositionMode = (gameMode == EditPosition)  ||
  698.              (gameMode == IcsExamining);
  699.   if (editPositionMode != oldEditPositionMode)
  700.   { set(xboardChessboard, MUIA_XBoard_EditPosition, editPositionMode);
  701.     oldEditPositionMode = editPositionMode;
  702.   }
  703. }
  704. /**/
  705.  
  706.  
  707. /***  FileNameAction() function
  708. ***
  709. ***  Brings up a file requester.
  710. **/
  711. int LoadGamePopUp(FILE *, int, char *);
  712.  
  713. typedef int (*FileProc)(FILE*, int, char*);
  714.  
  715. void FileNameAction(FileProc proc, char *openMode, char *filename)
  716.  
  717. {
  718.     FILE *fp;
  719.     int index;
  720.     char *p;
  721.  
  722.     if ((p = strchr(filename, ','))) {
  723.     *p++ = NULLCHAR;
  724.     index = atoi(p);
  725.     } else {
  726.     index = 0;
  727.     }
  728.  
  729.     if (!(fp = fopen(filename, openMode))) {
  730.     DisplayError("Failed to open file", errno);
  731.     } else {
  732.     (void) (*proc)(fp, index, filename);
  733.     }
  734.     ModeHighlight();
  735. }
  736. /**/
  737.  
  738.  
  739. /***  FileNamePopUp() function
  740. ***
  741. ***  Creates an ASL requester.
  742. **/
  743. void FileNamePopUp(char *title, char *deflt, char *pattern,
  744.            FileProc proc, char *openMode)
  745.  
  746. { struct FileRequester *requester;
  747.   struct Window *window;
  748.   UBYTE parsedPattern[20];
  749.   char filename[MSG_SIZ];
  750.  
  751.   if (!(requester = (struct FileRequester *) MUI_AllocAslRequest(ASL_FileRequest, NULL)))
  752.   { return;
  753.   }
  754.   ParsePatternNoCase((UBYTE *) pattern, parsedPattern, sizeof(parsedPattern));
  755.   strcpy(filename, deflt);
  756.   *PathPart((STRPTR) filename) = NULLCHAR;
  757.  
  758.   get(xboardWindow, MUIA_Window_Window, &window);
  759.  
  760.   if (MUI_AslRequestTags(requester,
  761.              ASLFR_Window, window,
  762.              ASLFR_PrivateIDCMP, TRUE,
  763.              ASLFR_SleepWindow, TRUE,
  764.              ASLFR_TitleText, title,
  765.              ASLFR_InitialFile, FilePart((STRPTR) deflt),
  766.              ASLFR_InitialDrawer, filename,
  767.              ASLFR_InitialPattern, pattern,
  768.              ASLFR_DoSaveMode, strcmp(openMode, "w") == 0,
  769.              ASLFR_RejectIcons, TRUE,
  770.              ASLFR_AcceptPattern, parsedPattern,
  771.              TAG_DONE))
  772.   { if (*requester->fr_File != NULLCHAR)
  773.     { strcpy(filename, (char *) requester->fr_Drawer);
  774.       AddPart((STRPTR) filename, requester->fr_File, sizeof(filename));
  775.       FileNameAction(proc, openMode, filename);
  776.     }
  777.   }
  778.  
  779.   MUI_FreeAslRequest(requester);
  780. }
  781. /**/
  782.  
  783.  
  784. /***  Button/menu procedures
  785. **/
  786. void ResetProc(void)
  787.  
  788. { ResetGameEvent();
  789. }
  790.  
  791. int LoadGamePopUp(FILE *f, int gameNumber, char *title)
  792.  
  793. {
  794.     cmailMsgLoaded = FALSE;
  795.     if (gameNumber == 0) {
  796.     int error = GameListBuild(f);
  797.  
  798.     if (error) {
  799.         DisplayError("Cannot build game list", error);
  800.     } else if (!ListEmpty(&gameList) &&
  801.            ((ListGame *) gameList.tailPred)->number > 1) {
  802.         GameListPopUp(f, title);
  803.         return TRUE;
  804.     }
  805.     GameListDestroy();
  806.     gameNumber = 1;
  807.     }
  808.     return(LoadGame(f, gameNumber, title, FALSE));
  809. }
  810.  
  811. void LoadGameProc(void)
  812.  
  813. {
  814.     FileNamePopUp("Load game file name?", "",
  815.           appData.oldSaveStyle ? "#?.game" : "#?.pgn",
  816.           LoadGamePopUp, "r");
  817. }
  818.  
  819. void LoadNextGameProc(void)
  820.  
  821. { ReloadGame(1);
  822. }
  823.  
  824. void LoadPrevGameProc(void)
  825.  
  826. { ReloadGame(-1);
  827. }
  828.  
  829. void ReloadGameProc(void)
  830.  
  831. { ReloadGame(0);
  832. }
  833.  
  834.  
  835. void LoadPositionProc(void)
  836.  
  837. { FileNamePopUp("Load position file name?", "",
  838.         appData.oldSaveStyle ? "#?.pos" : "#?.fen",
  839.         LoadPosition, "r");
  840. }
  841.  
  842. void SaveGameProc(void)
  843.  
  844. { FileNamePopUp("Save game file name?",
  845.         DefaultFileName(appData.oldSaveStyle ? ".game" : ".pgn"),
  846.         appData.oldSaveStyle ? "#?.game" : "#?.pgn",
  847.         SaveGame, "a");
  848. }
  849.  
  850. void AutoSaveGame(void)
  851.  
  852. { SaveGameProc();
  853. }
  854.  
  855. void SavePositionProc(void)
  856.  
  857. { FileNamePopUp("Save position file name",
  858.         DefaultFileName(appData.oldSaveStyle ? ".pos" : ".fen"),
  859.         appData.oldSaveStyle ? "#?.pos" : "#?.fen",
  860.         SavePosition, "a");
  861. }
  862.  
  863. void ReloadCmailMsgProc(void)
  864.  
  865. { ReloadCmailMsgEvent(FALSE);
  866. }
  867.  
  868. void QuitProc(void)
  869.  
  870. { ExitEvent(0);
  871. }
  872.  
  873. void EditCommentProc(void)
  874.  
  875. {
  876.     if (editCommentWindow) {
  877.     EditCommentPopDown();
  878.     } else {
  879.     EditCommentEvent();
  880.     }
  881. }
  882.  
  883.  
  884. void AlwaysQueenProc(void)
  885.  
  886. { APTR obj;
  887.  
  888.   if ((obj = ProcToMenuitem((APTR) AlwaysQueenProc)))
  889.   { get(obj, MUIA_Menuitem_Checked, &appData.alwaysPromoteToQueen);
  890.     set(xboardChessboard, MUIA_XBoard_AlwaysPromoteToQueen,
  891.     appData.alwaysPromoteToQueen);
  892.   }
  893. }
  894.  
  895. void AutoflagProc(void)
  896.  
  897. { APTR obj;
  898.  
  899.   if ((obj = ProcToMenuitem((APTR) AutoflagProc)))
  900.   { get(obj, MUIA_Menuitem_Checked, &appData.autoCallFlag);
  901.   }
  902. }
  903.  
  904. void AutoFlipViewProc(void)
  905.  
  906. { APTR obj;
  907.  
  908.   if ((obj = ProcToMenuitem((APTR) AutoFlipViewProc)))
  909.   { get(obj, MUIA_Menuitem_Checked, &appData.autoFlipView);
  910.   }
  911. }
  912.  
  913. void AutoobsProc(void)
  914.  
  915. { APTR obj;
  916.  
  917.   if ((obj = ProcToMenuitem((APTR) AutoobsProc)))
  918.   { get(obj, MUIA_Menuitem_Checked, &appData.autoObserve);
  919.   }
  920. }
  921.  
  922. void AutocommProc(void)
  923.  
  924. { APTR obj;
  925.  
  926.   if ((obj = ProcToMenuitem((APTR) AutocommProc)))
  927.   { get(obj, MUIA_Menuitem_Checked, &appData.autoComment);
  928.   }
  929. }
  930.  
  931. void AutosaveProc(void)
  932.  
  933. { APTR obj;
  934.  
  935.   if ((obj = ProcToMenuitem((APTR) AutosaveProc)))
  936.   { get(obj, MUIA_Menuitem_Checked, &appData.autoSaveGames);
  937.   }
  938. }
  939.  
  940. void BellProc(void)
  941.  
  942. { APTR obj;
  943.  
  944.   if ((obj = ProcToMenuitem((APTR) BellProc)))
  945.   { get(obj, MUIA_Menuitem_Checked, &appData.ringBellAfterMoves);
  946.   }
  947. }
  948.  
  949. void FlipViewProc(void)
  950.  
  951. { APTR obj;
  952.  
  953.   if ((obj = ProcToMenuitem((APTR) FlipViewProc)))
  954.   { get(obj, MUIA_Menuitem_Checked, &flipView);
  955.     DrawPosition(TRUE, NULL);
  956.   }
  957. }
  958.  
  959. void OldSaveStyleProc(void)
  960.  
  961. { APTR obj;
  962.  
  963.   if ((obj = ProcToMenuitem((APTR) OldSaveStyleProc)))
  964.   { get(obj, MUIA_Menuitem_Checked, &appData.oldSaveStyle);
  965.   }
  966. }
  967.  
  968. void QuietPlayProc(void)
  969.  
  970. { APTR obj;
  971.  
  972.   if ((obj = ProcToMenuitem((APTR) QuietPlayProc)))
  973.   { get(obj, MUIA_Menuitem_Checked, appData.quietPlay);
  974.   }
  975. }
  976.  
  977. void ShowCoordsProc(void)
  978.  
  979. { APTR obj;
  980.  
  981.   if ((obj = ProcToMenuitem((APTR) ShowCoordsProc)))
  982.   { get(obj, MUIA_Menuitem_Checked, &appData.showCoords);
  983.     set(xboardChessboard, MUIA_XBoard_ShowCoords, appData.showCoords);
  984.   }
  985. }
  986.  
  987. void ShowThinkingProc(void)
  988.  
  989. { APTR obj;
  990.  
  991.   if ((obj = ProcToMenuitem((APTR) ShowThinkingProc)))
  992.   { ULONG show;
  993.  
  994.     get(obj, MUIA_Menuitem_Checked, &show);
  995.     ShowThinkingEvent(show);
  996.   }
  997. }
  998.  
  999.  
  1000. void ErrorPopUp(char *, char *);
  1001. void AboutProc(void)
  1002.  
  1003. { char buf[MSG_SIZ*2];
  1004.  
  1005.   sprintf(buf, "%s\n\n%s\n%s\n%s\n\n%s\n%s",
  1006.       programName,
  1007.       "Copyright 1991 Digital Equipment Corporation",
  1008.       "Enhancements Copyright 1992-94 Free Software Foundation",
  1009.       "Amiga version copyright 1995 Jochen Wiedmann",
  1010.       "This program is free software and carries NO WARRANTY;",
  1011.       "see the file COPYING for more information.");
  1012.   ErrorPopUp("About AmyBoard", buf);
  1013. }
  1014. /**/
  1015.  
  1016.  
  1017.  
  1018.  
  1019.      
  1020. /***  Display functions
  1021. ***
  1022. ***  Error messages and similar
  1023. **/
  1024. void ErrorPopUp(char *title, char *label)
  1025.  
  1026. { MUI_RequestA(xboardApp, xboardWindow, 0, title, "Ok", label, NULL);
  1027. }
  1028.  
  1029. void DisplayMessage(char *message, char *extMessage)
  1030.  
  1031. { set(xboardText, MUIA_Text_Contents, message);
  1032.   set(xboardExtText, MUIA_Floattext_Text, extMessage);
  1033. }
  1034.  
  1035. void DisplayTitle(char *text)
  1036.  
  1037. { char title[MSG_SIZ];
  1038.   char *icon;
  1039.  
  1040.   if (text == NULL)
  1041.   { text = "";
  1042.   }
  1043.  
  1044.   /*
  1045.   if (appData.titleInWindow)
  1046.   {
  1047.   }
  1048.   */
  1049.   if (*text != NULLCHAR)
  1050.   { sprintf(title, "%s: %s", programName, text);
  1051.   }
  1052.   else if (appData.icsActive)
  1053.   { sprintf(title, "%s: %s", programName, appData.icsHost);
  1054.   }
  1055.   else if (*appData.cmailGameName != NULLCHAR)
  1056.   { sprintf(title, "%s: CMail", programName);
  1057.   }
  1058.   else if (appData.noChessProgram)
  1059.   { sprintf(title, "%s", programName);
  1060.   }
  1061.   else
  1062.   { if (StrStr(appData.firstChessProgram, "gnuchess"))
  1063.     { sprintf(title, "%s: GNU Chess", programName);
  1064.     }
  1065.     else
  1066.     { sprintf(title, "%s: %s", programName,
  1067.           FilePart((STRPTR) appData.firstChessProgram));
  1068.     }
  1069.   }
  1070.  
  1071.   get(xboardWindow, MUIA_Window_Title, &icon);
  1072.   if (strcmp(title, icon) != 0)
  1073.   { if ((icon = strdup(title)))
  1074.     { set(xboardWindow, MUIA_Window_Title, icon);
  1075.     }
  1076.   }
  1077. }
  1078.  
  1079. void DisplayError(char *message, int error)
  1080.  
  1081. { char buf[MSG_SIZ];
  1082.  
  1083.   if (error == 0)
  1084.   { if (appData.debugMode || appData.matchMode)
  1085.     { fprintf(stderr, "%s: %s\n", programName, message);
  1086.     }
  1087.     ErrorPopUp("Error", message);
  1088.   }
  1089.   else
  1090.   { if (appData.debugMode  ||  appData.matchMode)
  1091.     { fprintf(stderr, "%s: %s: %s\n",
  1092.           programName, message, strerror(error));
  1093.     }
  1094.     sprintf(buf, "%s: %s", message, strerror(error));
  1095.     ErrorPopUp("Error", buf);
  1096.   }
  1097. }
  1098.  
  1099. void DisplayFatalError(char *message, int error, int status)
  1100.  
  1101. { char buf[MSG_SIZ];
  1102.  
  1103.   if (error == 0)
  1104.   { fprintf(stderr, "%s: %s\n", programName, message);
  1105.     ErrorPopUp("Fatal Error", message);
  1106.   }
  1107.   else
  1108.   { fprintf(stderr, "%s: %s: %s\n",
  1109.         programName, message, strerror(error));
  1110.     sprintf(buf, "%s: %s", message, strerror(error));
  1111.     ErrorPopUp("Fatal Error", buf);
  1112.   }
  1113.   ExitEvent(status);
  1114. }
  1115.  
  1116. void DisplayInformation(char *message)
  1117.  
  1118. { ErrorPopUp("Information", message);
  1119. }
  1120.  
  1121. void RingBell(void)
  1122.  
  1123. { struct Screen *scrn;
  1124.  
  1125.   get(xboardWindow, MUIA_Window_Screen, &scrn);
  1126.   DisplayBeep(scrn);
  1127. }
  1128.  
  1129. void EchoOn(void)
  1130.  
  1131. { /* not implemented */
  1132. }
  1133.  
  1134. void EchoOff(void)
  1135.  
  1136. { /* not implemented */
  1137. }
  1138.  
  1139. void Raw(void)
  1140.  
  1141. { /* not implemented */
  1142. }
  1143. /**/
  1144.  
  1145.  
  1146. /***  UserName() function
  1147. **/
  1148. char *UserName(void)
  1149.  
  1150. { char *ptr;
  1151.  
  1152.   if ((ptr = getenv("USERNAME")))
  1153.   { return(ptr);
  1154.   }
  1155.   return("Unknown user");
  1156. }
  1157. /**/
  1158.  
  1159.  
  1160. /***  HostName() function
  1161. ***/
  1162. char *HostName(void)
  1163.  
  1164. { char *ptr;
  1165.  
  1166.   if ((ptr = getenv("HOSTNAME")))
  1167.   { return(ptr);
  1168.   }
  1169.   return("Unknown host");
  1170. }
  1171. /**/
  1172.  
  1173.  
  1174. /***  CreateMUIApp() function
  1175. ***
  1176. ***  Creates the GUI.
  1177. **/
  1178. typedef void (*menuEventFunc) (void);
  1179. _HOOK_FUNC(VOID, menuCallback, struct Hook *hook,
  1180.                    Object *obj,
  1181.                    menuEventFunc *func)
  1182. { if (func)
  1183.   { (*func)();
  1184.   }
  1185. }
  1186.  
  1187. struct Hook menuCallbackHook =
  1188. { { NULL, NULL },
  1189.   (HOOKFUNC) menuCallback,
  1190.   NULL,
  1191.   NULL
  1192. };
  1193.  
  1194.  
  1195. void CreateMUIApp(void)
  1196.  
  1197. { int squareSize = 0;
  1198.   APTR lowerButton, llowerButton, higherButton, hhigherButton, pauseButton;
  1199.  
  1200.   if (StrCaseCmp((STRPTR) appData.boardSize, (STRPTR) "small") == 0)
  1201.   { squareSize = 40;
  1202.   }
  1203.   else if (StrCaseCmp((STRPTR) appData.boardSize, (STRPTR) "medium") == 0)
  1204.   { squareSize = 64;
  1205.   }
  1206.   else if (StrCaseCmp((STRPTR) appData.boardSize, (STRPTR) "large") == 0)
  1207.   { squareSize = 80;
  1208.   }
  1209.  
  1210.   xboardApp = ApplicationObject,
  1211.         MUIA_Application_Title,       "AmyBoard",
  1212.         MUIA_Application_Version,     VERSTAG,
  1213.         MUIA_Application_Copyright,   "© 1995, Jochen Wiedmann",
  1214.         MUIA_Application_Author,      "Jochen Wiedmann",
  1215.         MUIA_Application_Description, "The GNU chess interface for the Amiga",
  1216.         MUIA_Application_Base,        "AmyBoard",
  1217.         SubWindow, xboardWindow = WindowObject,
  1218.         MUIA_Window_Title,  programName,
  1219.         MUIA_Window_ID,     MAKE_ID('M','A','I','N'),
  1220.         MUIA_Window_Menustrip, xboardMenu = MUI_MakeObject(MUIO_MenustripNM, xboardNewMenu, 0),
  1221.         WindowContents, HGroup,
  1222.             Child, xboardChessboard = XBoardObject(
  1223.             MUIA_Frame, MUIV_Frame_InputList,
  1224.             MUIA_Weight, 400,
  1225.             MUIA_XBoard_SquareWidth, squareSize,
  1226.             MUIA_XBoard_SquareHeight, squareSize,
  1227.             MUIA_XBoard_FlipView, appData.flipView,
  1228.             MUIA_XBoard_ShowCoords, appData.showCoords,
  1229.             MUIA_XBoard_LightSquarePen, appData.lightSquareColor,
  1230.             MUIA_XBoard_DarkSquarePen, appData.darkSquareColor,
  1231.             MUIA_XBoard_WhitePiecePen, appData.whitePieceColor,
  1232.             MUIA_XBoard_BlackPiecePen, appData.blackPieceColor,
  1233.             MUIA_XBoard_BitmapDirectory, appData.bitmapDirectory,
  1234.             End,
  1235.             Child, VGroup,
  1236.             MUIA_Weight, 100,
  1237.             Child, HGroup,
  1238.                 Child, llowerButton = SimpleButton("<<"),
  1239.                 Child, lowerButton = KeyButton("<", "<"),
  1240.                 Child, pauseButton = KeyButton("P", "p"),
  1241.                 Child, higherButton = KeyButton(">", ">"),
  1242.                 Child, hhigherButton = SimpleButton(">>"),
  1243.             End,
  1244.             Child, xboardUpperTime = TextObject,
  1245.                 TextFrame,
  1246.             End,
  1247.             Child, HGroup,
  1248.                 Child, HSpace(0),
  1249.                 Child, TextObject,
  1250.                 MUIA_Text_Contents, ":",
  1251.                 End,
  1252.                 Child, HSpace(0),
  1253.             End,
  1254.             Child, xboardLowerTime = TextObject,
  1255.                 TextFrame,
  1256.             End,
  1257.             Child, xboardText = TextObject,
  1258.                 TextFrame,
  1259.             End,
  1260.             Child, xboardExtText = FloattextObject,
  1261.                 TextFrame,
  1262.             End,
  1263.             Child, VSpace(0),
  1264.             End,
  1265.         End,
  1266.         End,
  1267.     End;
  1268.  
  1269.   if (!xboardApp)
  1270.   { DisplayFatalError("Can't create application.", 0, 10);
  1271.   }
  1272.  
  1273.   set(ProcToMenuitem((APTR) AlwaysQueenProc), MUIA_Menuitem_Checked,
  1274.       appData.alwaysPromoteToQueen);
  1275.   set(ProcToMenuitem((APTR) AutoflagProc), MUIA_Menuitem_Checked,
  1276.       appData.autoCallFlag);
  1277.   set(ProcToMenuitem((APTR) AutoFlipViewProc), MUIA_Menuitem_Checked,
  1278.       appData.autoFlipView);
  1279.   set(ProcToMenuitem((APTR) AutoobsProc), MUIA_Menuitem_Checked,
  1280.       appData.autoObserve);
  1281.   set(ProcToMenuitem((APTR) AutocommProc), MUIA_Menuitem_Checked,
  1282.       appData.autoComment);
  1283.   set(ProcToMenuitem((APTR) AutosaveProc), MUIA_Menuitem_Checked,
  1284.       appData.autoSaveGames);
  1285.   set(ProcToMenuitem((APTR) BellProc), MUIA_Menuitem_Checked,
  1286.       appData.ringBellAfterMoves);
  1287.   set(ProcToMenuitem((APTR) OldSaveStyleProc), MUIA_Menuitem_Checked,
  1288.       appData.oldSaveStyle);
  1289.   set(ProcToMenuitem((APTR) QuietPlayProc), MUIA_Menuitem_Checked,
  1290.       appData.quietPlay);
  1291.   set(ProcToMenuitem((APTR) ShowCoordsProc), MUIA_Menuitem_Checked,
  1292.       appData.showCoords);
  1293.   set(ProcToMenuitem((APTR) ShowThinkingProc), MUIA_Menuitem_Checked,
  1294.       appData.showThinking);
  1295.  
  1296.   { ULONG open;
  1297.  
  1298.     set(xboardWindow, MUIA_Window_Open, TRUE);
  1299.  
  1300.     get(xboardWindow, MUIA_Window_Open, &open);
  1301.     if (!open)
  1302.     { DisplayFatalError("Can't open window.", 0, 10);
  1303.     }
  1304.   }
  1305.  
  1306.   DoMethod(xboardWindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  1307.        xboardApp, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
  1308.   DoMethod(xboardWindow, MUIM_Notify, MUIA_Window_MenuAction, MUIV_EveryTime,
  1309.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, MUIV_TriggerValue);
  1310.   DoMethod(llowerButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1311.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, ToStartEvent);
  1312.   DoMethod(lowerButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1313.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, BackwardEvent);
  1314.   DoMethod(pauseButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1315.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, PauseEvent);
  1316.   DoMethod(higherButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1317.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, ForwardEvent);
  1318.   DoMethod(hhigherButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1319.        xboardApp, 3, MUIM_CallHook, &menuCallbackHook, ToEndEvent);
  1320.   DoMethod(xboardLowerTime, MUIM_Notify, MUIA_Pressed, FALSE,
  1321.        xboardApp, 3, MUIM_CallHook, &CallFlagEvent);
  1322.   DoMethod(xboardUpperTime, MUIM_Notify, MUIA_Pressed, FALSE,
  1323.        xboardApp, 3, MUIM_CallHook, &CallFlagEvent);
  1324. }
  1325. /**/
  1326.  
  1327.  
  1328. /***  Timer display functions
  1329. **/
  1330. void DisplayTimerLabel(Boolean white, LONG timer, int highlight)
  1331.  
  1332. { APTR obj;
  1333.   char buf[MSG_SIZ];
  1334.   char *ptr;
  1335.  
  1336.   if ((white && !flipView)  ||
  1337.       (!white  &&  flipView))
  1338.   { obj = xboardLowerTime;
  1339.   }
  1340.   else
  1341.   { obj = xboardUpperTime;
  1342.   }
  1343.  
  1344.   ptr = buf;
  1345.   if (highlight)
  1346.   { *ptr++ = '\033';
  1347.     *ptr++ = 'b';
  1348.   }
  1349.  
  1350.   if (appData.clockMode)
  1351.   { sprintf(ptr, "%s", TimeString(timer));
  1352.   }
  1353.   else
  1354.   { *ptr++ = '-';
  1355.     *ptr++ = NULLCHAR;
  1356.   }
  1357.   set(obj, MUIA_Text_Contents, buf);
  1358. }
  1359.  
  1360. void DisplayWhiteClock(LONG timeRemaining, int highlight)
  1361.  
  1362. { DisplayTimerLabel(TRUE, timeRemaining, highlight);
  1363. }
  1364.  
  1365. void DisplayBlackClock(LONG timeRemaining, int highlight)
  1366.  
  1367. { DisplayTimerLabel(FALSE, timeRemaining, highlight);
  1368. }
  1369. /**/
  1370.  
  1371.  
  1372. /***  Comment section
  1373. ***
  1374. ***  Functions to display and edit a comment.
  1375. ***
  1376. ***  We open a separate MUI window for comments and add it to the
  1377. ***  application object. Pressing a button within the window or
  1378. ***  closing it will result in calling a hook. (CommentCallback or
  1379. ***  EditCommentCallback, respectively.)
  1380. ***
  1381. **/
  1382. APTR CommentCreate(STRPTR name, STRPTR text,
  1383.            ULONG mutable, struct Hook *hook, ULONG index)
  1384.  
  1385. { APTR commentWindow;
  1386.   /* Suppress warnings on uninitialized variables. */
  1387.   APTR okButton = NULL, cancelButton = NULL, editButton = NULL,
  1388.        clearButton = NULL, textObject = NULL;
  1389.   STRPTR title;
  1390.  
  1391.   if (!(title = (STRPTR) strdup((char *) name)))
  1392.   { return(NULL);
  1393.   }
  1394.  
  1395.   if (mutable)
  1396.   { commentWindow = WindowObject,
  1397.         MUIA_Window_ID, MAKE_ID('C','M','N','T'),
  1398.         MUIA_Window_Title, title,
  1399.         WindowContents, VGroup,
  1400.         Child, textObject = String(text, 4096),
  1401.         Child, HGroup,
  1402.             Child, okButton = KeyButton("ok", "o"),
  1403.             Child, clearButton = KeyButton("clear", "c"),
  1404.             Child, cancelButton = KeyButton("abort", "a"),
  1405.         End,
  1406.         End,
  1407.     End;
  1408.   }
  1409.   else
  1410.   { commentWindow = WindowObject,
  1411.         MUIA_Window_ID, MAKE_ID('C','M','N','T'),
  1412.         MUIA_Window_Title, title,
  1413.         WindowContents, VGroup,
  1414.         Child, textObject = TextObject,
  1415.             MUIA_Text_Contents, text,
  1416.             TextFrame,
  1417.         End,
  1418.         Child, HGroup,
  1419.             Child, editButton = KeyButton("edit", "e"),
  1420.             Child, cancelButton = KeyButton("close", "c"),
  1421.         End,
  1422.         End,
  1423.     End;
  1424.   }
  1425.  
  1426.  
  1427.   if (commentWindow)
  1428.   { ULONG open;
  1429.  
  1430.     DoMethod(xboardApp, OM_ADDMEMBER, commentWindow);
  1431.     set(commentWindow, MUIA_Window_Open, TRUE);
  1432.     get(commentWindow, MUIA_Window_Open, &open);
  1433.     if (!open)
  1434.     { DoMethod(xboardApp, OM_REMMEMBER, commentWindow);
  1435.       MUI_DisposeObject(commentWindow);
  1436.       commentWindow = NULL;
  1437.     }
  1438.     else
  1439.     { DoMethod(commentWindow, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  1440.            commentWindow, 3, MUIM_CallHook, hook, (LONG) 0);
  1441.       if (mutable)
  1442.       { DoMethod(okButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1443.          textObject, 4, MUIM_CallHook, hook, (LONG) 1, (ULONG) index);
  1444.     DoMethod(clearButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1445.          textObject, 3, MUIM_CallHook, hook, (LONG) -1);
  1446.     DoMethod(cancelButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1447.          textObject, 3, MUIM_CallHook, hook, (LONG) 0);
  1448.       }
  1449.       else
  1450.       { DoMethod(editButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1451.          commentWindow, 3, MUIM_CallHook, hook, (LONG) 1);
  1452.     DoMethod(cancelButton, MUIM_Notify, MUIA_Pressed, FALSE,
  1453.          commentWindow, 3, MUIM_CallHook, hook, (LONG) 0);
  1454.       }
  1455.     }
  1456.   }
  1457.  
  1458.   return(commentWindow);
  1459. }
  1460.  
  1461. _HOOK_FUNC(VOID, CommentCallback, struct Hook *Hook,
  1462.                   APTR obj,
  1463.                   va_list args)
  1464.  
  1465. { ULONG edit;
  1466.  
  1467.   edit = va_arg(args, ULONG);
  1468.   if (edit)
  1469.   { EditCommentProc();
  1470.   }
  1471.   CommentPopDown();
  1472. }
  1473. const struct Hook commentCallbackHook =
  1474. { { NULL, NULL },
  1475.   (HOOKFUNC) CommentCallback,
  1476.   NULL,
  1477.   NULL
  1478. };
  1479.  
  1480. APTR commentWindow  = NULL;
  1481. void CommentPopUp(char *title, char *text)
  1482.  
  1483. { CommentPopDown();
  1484.   commentWindow = CommentCreate((STRPTR) title, (STRPTR) text, FALSE,
  1485.                 (struct Hook *) &commentCallbackHook, 0);
  1486. }
  1487.  
  1488. void CommentPopDown(void)
  1489.  
  1490. { if (commentWindow)
  1491.   { CloseMuiWindow(commentWindow);
  1492.     commentWindow = NULL;
  1493.   }
  1494. }
  1495.  
  1496. _HOOK_FUNC(VOID, EditCommentCallback, struct Hook *hook,
  1497.                       APTR obj,
  1498.                       va_list args)
  1499.  
  1500. { LONG done;
  1501.  
  1502.   done = va_arg(args, LONG);
  1503.   switch(done)
  1504.   { case 1:
  1505.       { STRPTR val;
  1506.     ULONG index;
  1507.  
  1508.     index = va_arg(args, ULONG);
  1509.     get(obj, MUIA_String_Contents, &val);
  1510.     ReplaceComment(index, (char *) val);
  1511.     EditCommentPopDown();
  1512.       }
  1513.       break;
  1514.     case -1:
  1515.       set(obj, MUIA_String_Contents, NULL);
  1516.       break;
  1517.     default:
  1518.       EditCommentPopDown();
  1519.       break;
  1520.   }
  1521. }
  1522. const struct Hook editCommentCallbackHook =
  1523. { { NULL, NULL },
  1524.   (HOOKFUNC) EditCommentCallback,
  1525.   NULL,
  1526.   NULL
  1527. };
  1528.  
  1529. void EditCommentPopUp(int index, char *title, char *text)
  1530.  
  1531. { EditCommentPopDown();
  1532.   editCommentWindow = CommentCreate((STRPTR) title, (STRPTR) text, TRUE,
  1533.                     (struct Hook *) &editCommentCallbackHook,
  1534.                     index);
  1535. }
  1536.  
  1537. void EditCommentPopDown(void)
  1538.  
  1539. { if (editCommentWindow)
  1540.   { CloseMuiWindow(editCommentWindow);
  1541.     editCommentWindow = NULL;
  1542.   }
  1543. }
  1544. /**/
  1545.  
  1546.  
  1547. /*** CmailSigHandlerCallBack() function
  1548. **/
  1549. void CmailSigHandlerCallBack(InputSourceRef isr, char *message, int count, int error)
  1550.  
  1551. { ReloadCmailMsgEvent(TRUE);
  1552. }
  1553. /**/
  1554.